home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / utility / cbhd502 / src / c / scsi.c < prev    next >
C/C++ Source or Header  |  1997-01-21  |  5KB  |  232 lines

  1. /*{{{}}}*/
  2. /*********************************************************************
  3.  *
  4.  * SCSI-Aufrufe für alle Geräte
  5.  *
  6.  * $Source: u:\k\usr\src\scsi\cbhd\rcs\scsi.c,v $
  7.  *
  8.  * $Revision: 1.3 $
  9.  *
  10.  * $Author: Steffen_Engel $
  11.  *
  12.  * $Date: 1996/02/14 11:22:12 $
  13.  *
  14.  * $State: Exp $
  15.  *
  16.  **********************************************************************
  17.  * History:
  18.  *
  19.  * $Log: scsi.c,v $
  20.  * Revision 1.3  1996/02/14  11:22:12  Steffen_Engel
  21.  * Maskierung in SetCmd6 korrigiert
  22.  *
  23.  * Revision 1.2  1995/12/21  01:23:42  S_Engel
  24.  * Kommandostruktur immer lokal für Reentranz
  25.  *
  26.  * Revision 1.1  1995/11/28  19:14:14  S_Engel
  27.  * Initial revision
  28.  *
  29.  *
  30.  *
  31.  *********************************************************************/
  32.  
  33. #include <import.h>
  34.  
  35. #ifdef _GCC_
  36.   #include <osbind.h>
  37. #endif
  38. #include <scsidrv/scsiio.h>
  39.  
  40. #include <export.h>
  41. #include <scsidrv/scsi.h>
  42.  
  43. /*-------------------------------------------------------------------------*/
  44. /*-                                                                       -*/
  45. /*- Variablen                                                             -*/
  46. /*-                                                                       -*/
  47. /*-------------------------------------------------------------------------*/
  48. tHandle   Handle;
  49. tSCSICmd  SCmd;
  50.  
  51.  
  52.  
  53. /* exportierte Funktionen */
  54.  
  55. LONG TestUnitReady(void)
  56. {{{
  57. tCmd6 Cmd;
  58.   SetCmd6(&Cmd, 0x00, 0, 0);
  59.   return In(SetCmd((BYTE *)&Cmd, 6, NULL, 0, DefTimeout));
  60. }}}
  61.  
  62.  
  63. LONG Inquiry(void  *data, BOOLEAN Vital, UWORD VitalPage, WORD length)
  64. {{{
  65. tCmd6 Cmd;
  66.  
  67.   SetCmd6(&Cmd, 0x12, 0, length);
  68.  
  69.   if (Vital)
  70.   {
  71.     Cmd.LunAdr |= 1;                 /* Vital gefordert  */
  72.     Cmd.Adr = VitalPage * 0x100;     /* Page eintragen   */
  73.   }
  74.   return (In(SetCmd((BYTE *)&Cmd, 6, data, length, 1000)));
  75. }}}
  76.  
  77.  
  78. LONG ModeSelect(UWORD        SelectFlags,
  79.                    void        *Buffer,
  80.                    UWORD        ParmLen)
  81. {{{
  82. tCmd6 Cmd;
  83.   ParmLen = ParmLen
  84.             + sizeof(tParmHead)       /* ParameterHeader                */
  85.             + sizeof(tBlockDesc);     /* Block-Deskriptor               */
  86.  
  87.   SetCmd6(&Cmd, 0x15, 0, ParmLen);
  88.   Cmd.LunAdr |= SelectFlags % 0x20;
  89.  
  90.   return Out(SetCmd((BYTE *)&Cmd, 6, Buffer, ParmLen, DefTimeout));
  91. }}}
  92.  
  93.  
  94. LONG ModeSense(UWORD     PageCode,
  95.                   UWORD     PageControl,
  96.                   void     *Buffer,
  97.                   UWORD     ParmLen)
  98. {{{
  99. tCmd6 Cmd;
  100.   ParmLen = ParmLen
  101.             + sizeof(tParmHead)       /* ParameterHeader                */
  102.             + sizeof(tBlockDesc);     /* Block-Deskriptor               */
  103.  
  104.   SetCmd6(&Cmd, 0x1A, 0, ParmLen);
  105.   Cmd.Adr = ((PageControl * 64 + PageCode) % 0x100)*0x100;
  106.  
  107.   return In(SetCmd((BYTE *)&Cmd, 6, Buffer, ParmLen, DefTimeout));
  108. }}}
  109.  
  110.  
  111. LONG PreventMediaRemoval(BOOLEAN Prevent)
  112. {{{
  113. tCmd6 Cmd;
  114.  
  115.   if (Prevent)
  116.     SetCmd6(&Cmd, 0x01E, 0, 1);
  117.   else
  118.     SetCmd6(&Cmd, 0x01E, 0, 0);
  119.  
  120.   return In(SetCmd((BYTE *)&Cmd, 6, NULL, 0, DefTimeout));
  121. }}}
  122.  
  123.  
  124. long ssp;
  125.  
  126. void SuperOn(void)
  127. {{{
  128.   ssp = Super(0);
  129. }}}
  130.  
  131. void SuperOff(void)
  132. {{{
  133.   Super((void *) ssp);
  134. }}}
  135.  
  136. void Wait(ULONG Ticks)
  137. {{{
  138. long *hz200 = (long *)0x4ba;
  139. long endtime;
  140.  
  141.   endtime = *hz200 + Ticks;
  142.  
  143.   while (*hz200 < endtime)
  144.   {
  145.   }
  146. }}}
  147.  
  148. void SetBlockSize(ULONG NewLen)
  149. {{{
  150.   BlockLen = NewLen;
  151. }}}
  152.  
  153. ULONG GetBlockSize()
  154. {{{
  155.   return BlockLen;
  156. }}}
  157.  
  158.  
  159. void SetScsiUnit(tHandle handle, WORD Lun, ULONG MaxLen)
  160. {{{
  161.   Handle = handle;
  162.   LogicalUnit = Lun*32;
  163.   MaxDmaLen = MaxLen;
  164. }}}
  165.  
  166.  
  167. void SetCmd6(tCmd6 *Cmd,
  168.              UWORD Opcode,
  169.              ULONG BlockAdr,
  170.              UWORD TransferLen)
  171. {{{
  172.   Cmd->Command = Opcode;
  173.   Cmd->LunAdr  = LogicalUnit + (BlockAdr/0x10000L & 0x1F);
  174.   Cmd->Adr     = BlockAdr % 0x10000L;
  175.   Cmd->Len     = TransferLen;
  176.   Cmd->Flags   = 0;
  177. }}}
  178.  
  179. void SetCmd10(tCmd10 *Cmd,
  180.               UWORD Opcode,
  181.               ULONG BlockAdr,
  182.               UWORD TransferLen)
  183. {{{
  184.   Cmd->Command   = Opcode;
  185.   Cmd->Lun       = LogicalUnit;
  186.   Cmd->Adr       = BlockAdr;
  187.   Cmd->Reserved  = 0;
  188.   Cmd->LenHigh   = TransferLen / 0x100;
  189.   Cmd->LenLow    = TransferLen % 0x100;
  190.   Cmd->Flags     = 0;
  191. }}}
  192.  
  193. void SetCmd12(tCmd12 *Cmd,
  194.               UWORD Opcode,
  195.               ULONG BlockAdr,
  196.               ULONG TransferLen)
  197. {{{
  198.   Cmd->Command = Opcode;
  199.   Cmd->Lun     = LogicalUnit;
  200.   Cmd->Adr     = BlockAdr;
  201.   Cmd->Len     = TransferLen;
  202.   Cmd->Reserved= 0;
  203.   Cmd->Flags   = 0;
  204. }}}
  205.  
  206.  
  207. tpSCSICmd SetCmd(BYTE    *Cmd,
  208.                  WORD     CmdLen,
  209.                  void    *Buffer,
  210.                  ULONG    Len,
  211.                  ULONG    TimeOut)
  212. {{{
  213.   SCmd.Handle = Handle;
  214.   SCmd.Cmd    = Cmd;
  215.   SCmd.CmdLen = CmdLen;
  216.   SCmd.Buffer = Buffer;
  217.   SCmd.TransferLen = Len;
  218.   SCmd.SenseBuffer = ReqBuff;
  219.   SCmd.Timeout  = TimeOut;
  220.   SCmd.Flags    = ScsiFlags;
  221.   return &SCmd;
  222. }}}
  223.  
  224. BOOLEAN init_scsi()
  225. {
  226.   /* Defaults setzen */
  227.   SetBlockSize(512L);
  228.  
  229.   return init_scsiio();
  230. }
  231.  
  232.